(function () {
  // 定义一个 Animal 父类
  class Animal {
    name: string;
    age: number;

    constructor(name: string, age: number) {
      this.name = name;
      this.age = age;
    }

    sayHello(msg: string) {
      console.log(msg);
    }
  }

  // 子类继承 使用继承后子类将拥有父类的所有方法和属性
  class Dog extends Animal {
    run() {
      console.log(`${this.name}在跑~~~`);
    }
  }

  class Cat extends Animal {
    // 子类方法覆盖父类的同名方法     称为方法的重写override
    sayHello() {
      console.log("喵喵喵");
    }
  }

  // 不建议改别人的类  开闭原则（OCP）—— 对扩展开放，对修改关闭

  const d = new Dog("spike", 4);
  console.log(d);
  d.sayHello("汪汪汪");
  d.run();

  const c = new Cat("tom", 3);
  console.log(c);
  c.sayHello();
})();
